package com.yc.cloud.admin.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yc.cloud.admin.dto.request.HwMonitoringPointCreateReqDTO;
import com.yc.cloud.admin.dto.request.HwMonitoringPointQueryReqDTO;
import com.yc.cloud.admin.dto.request.HwMonitoringPointUpdateReqDTO;
import com.yc.cloud.admin.vo.HwMonitoringPointVo;
import com.yc.cloud.common.orm.CommonPage;
import com.yc.cloud.entity.HwMonitoringPoint;

import java.util.List;

/**
 * <p>
 * 监视点管理表 服务类
 * </p>
 *
 * @author Claude Code
 * @since 2025-09-29
 */
public interface HwMonitoringPointService extends IService<HwMonitoringPoint> {

    /**
     * 创建监视点
     *
     * @param createReqDTO 创建请求参数
     * @return 创建结果
     */
    Boolean create(HwMonitoringPointCreateReqDTO createReqDTO);

    /**
     * 更新监视点
     *
     * @param id 监视点ID
     * @param updateReqDTO 更新请求参数
     * @return 更新结果
     */
    Boolean update(Long id, HwMonitoringPointUpdateReqDTO updateReqDTO);

    /**
     * 删除监视点
     *
     * @param id 监视点ID
     * @return 删除结果
     */
    Boolean delete(Long id);

    /**
     * 根据ID获取监视点详情
     *
     * @param id 监视点ID
     * @return 监视点详情
     */
    HwMonitoringPointVo getDetail(Long id);

    /**
     * 分页查询监视点
     *
     * @param queryReqDTO 查询请求参数
     * @return 分页结果
     */
    CommonPage<HwMonitoringPointVo> list(HwMonitoringPointQueryReqDTO queryReqDTO);

    /**
     * 根据区域ID获取监视点列表
     *
     * @param regionId 区域ID
     * @return 监视点列表
     */
    List<HwMonitoringPointVo> listByRegionId(Long regionId);

    /**
     * 根据区域ID列表获取监视点列表（支持子区域递归查询）
     *
     * @param regionIds 区域ID列表
     * @param includeChildren 是否包含子区域
     * @return 监视点列表
     */
    List<HwMonitoringPointVo> listByRegionIds(List<Long> regionIds, boolean includeChildren);

    /**
     * 根据监视点类型获取监视点列表
     *
     * @param pointType 监视点类型
     * @return 监视点列表
     */
    List<HwMonitoringPointVo> listByPointType(Integer pointType);

    /**
     * 根据重要程度获取监视点列表
     *
     * @param importanceLevel 重要程度
     * @return 监视点列表
     */
    List<HwMonitoringPointVo> listByImportanceLevel(Integer importanceLevel);

    /**
     * 启用/禁用监视点
     *
     * @param id 监视点ID
     * @param status 状态：1-启用, 0-禁用
     * @return 操作结果
     */
    Boolean updateStatus(Long id, Integer status);

    /**
     * 检查监视点编码是否已存在
     *
     * @param code 监视点编码
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean existsByCode(String code, Long excludeId);

    /**
     * 统计区域下的监视点数量
     *
     * @param regionId 区域ID
     * @return 监视点数量
     */
    Long countByRegionId(Long regionId);

    /**
     * 获取所有启用的监视点列表
     *
     * @return 监视点列表
     */
    List<HwMonitoringPointVo> listAllEnabled();

    /**
     * 根据监视点编码获取监视点
     *
     * @param code 监视点编码
     * @return 监视点详情
     */
    HwMonitoringPointVo getByCode(String code);

    /**
     * 批量绑定相机到监视点（会先解绑该监视点原有的所有相机）
     *
     * @param monitoringPointId 监视点ID
     * @param cameraIds 相机ID列表
     * @return 绑定成功的数量
     */
    Integer bindCameras(Long monitoringPointId, List<Long> cameraIds);

    /**
     * 查询监视点绑定的相机列表
     *
     * @param monitoringPointId 监视点ID
     * @return 相机列表
     */
    List<com.yc.cloud.admin.vo.HwCameraVo> listBoundCameras(Long monitoringPointId);

    /**
     * 查询监视点可绑定的相机列表
     * （包括未绑定任何监视点的相机 + 已绑定到当前监视点的相机）
     *
     * @param monitoringPointId 监视点ID
     * @return 可绑定的相机列表
     */
    List<com.yc.cloud.admin.vo.HwCameraVo> listBindableCameras(Long monitoringPointId);

    /**
     * 统计监视点绑定的相机数量
     *
     * @param monitoringPointId 监视点ID
     * @return 相机数量
     */
    Long countBoundCameras(Long monitoringPointId);
}